package sqldao

import (
	"database/sql"
	"gorm.io/driver/mysql"
	"fmt"
	cmm "github.com/darjun/go-daily-lib/jobrunner/common"
	"gorm.io/gorm"
	"time"
)

//默认使用结构体名的 蛇形复数 作为表名，字段名的 蛇形 作为列名
type User struct {
	ID           uint	// 默认情况下，名为 `ID` 的字段会作为表的主键
	Name         string
	Email        *string
	Age          uint8			`gorm:"column:user_age"` //将列名设为user_age，这玩意就像jpa的注解一样的
	Birthday     time.Time		// 列名是 `birthday`
	Telephone    string
	CreatedAt    time.Time		// 列名是 `created_at`
	UpdatedAt    time.Time
	MemberNumber sql.NullString
	Bd			 sql.NullTime
}

//User结构体实现了Tabler接口，TableName方法会将 User 的表名重写为t_user
func (u User) TableName() string {
	return "t_user"
}

func Init() {
	cmm.Version()
	fmt.Println("Hi, this is MySQL")
	// 参考 https://github.com/go-sql-driver/mysql#dsn-data-source-name 获取详情
	var dsn string = "user:pass@tcp(127.0.0.1:3306)/dbname?charset=utf8mb4&parseTime=True&loc=Local"
	db, err := gorm.Open(mysql.Open(dsn), &gorm.Config{})
	if err != nil {

	}
	datasource, err := db.DB() //返回内置的连接池，GORM 使用 [database/sql](https://pkg.go.dev/database/sql) 来维护连接池
	datasource.SetMaxIdleConns(2)
	datasource.SetMaxOpenConns(10)
	datasource.SetConnMaxLifetime(time.Hour)

	user := User{Name: "学员", Email: nil, Age: 25, Telephone: "18896723719"}
	var result *gorm.DB = db.Create(&user) // 通过数据的指针来创建
	if result.Error != nil {

	} else {
		fmt.Println("插入成功，User#ID是：", user.ID) //ID被自动赋值了
		fmt.Println(result.RowsAffected) //返回插入的记录条数
	}

	var user2 User = User{}
	db.First(&user2)

	// 原生 SQL
	//https://gorm.io/zh_CN/docs/sql_builder.html
	rows, err := db.Raw("select name, age, email from users where name = ?", "jinzhu").Rows()
	defer rows.Close()
	for rows.Next() {
		rows.Scan(&name, &age, &email)

		// 业务逻辑...
	}

	//将 sql.Rows 扫描至 model
	//使用 ScanRows 将一行记录扫描至一个结构体struct，比如下面的代码
	rows2, err := db.Model(&User{}).Where("name = ?", "jinzhu").Select("name, age, email").Rows() // (*sql.Rows, error)
	defer rows2.Close()

	var user3 User
	for rows.Next() {
		// ScanRows 将一行扫描至 user
		db.ScanRows(rows, &user3)

		// 业务逻辑... 现在user3里面就已经被填充了数据了
	}
}